package com.ruyixing.shopmanager.http;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;

public class RYHttpClient {
	private static final String TAG = "RYHttpClient";

	private static final String BASE_URL = "http://223.4.99.93/www.17ruyi.com/api.php";

	private static AsyncHttpClient client = new AsyncHttpClient();

	public static void cancleRequest(Context context) {
		client.cancelRequests(context, true);
	}

	public static void doLogin(Context context, RYHttpResponseHandler handler,
			String username, String password) {
		RequestParams params = new RequestParams();
		params.put("username", username);
		params.put("password", password);
		handler.setParser(new LoginParser());
		post(context, BASE_URL + "?op=app_member&action=login", params, handler);
	}

	private static void get(Context context, RequestParams params,
			AsyncHttpResponseHandler responseHandler) {
		Log.v(TAG, BASE_URL + " ====== " + params.toString());
		client.get(context, BASE_URL, params, responseHandler);
	}

	private static void post(Context context, String url, RequestParams params,
			AsyncHttpResponseHandler responseHandler) {
		Log.v(TAG, url + " ====== " + params.toString());
		client.post(context, url, params, responseHandler);
	}

	private static void post(Context context, RequestParams params,
			AsyncHttpResponseHandler responseHandler) {
		Log.v(TAG, BASE_URL + " ====== " + params.toString());
		client.post(context, BASE_URL, params, responseHandler);
	}

	private static RequestParams getParams(String op, String action) {
		RequestParams params = new RequestParams();
		if (!TextUtils.isEmpty(op)) {
			params.put("op", op);
		}
		if (!TextUtils.isEmpty(action)) {
			params.put("action", action);
		}

		return params;
	}

	/**
	 * 
	 * @param url
	 *            Service net address
	 * @param params
	 *            text content
	 * @param files
	 *            pictures
	 * @return String result of Service response
	 * @throws IOException
	 */
	private static String post(String url, Map<String, String> params,
			Map<String, File> files, String bduss) throws IOException {
		String BOUNDARY = java.util.UUID.randomUUID().toString();
		String PREFIX = "--", LINEND = "\r\n";
		String MULTIPART_FROM_DATA = "multipart/form-data";
		String CHARSET = "UTF-8";

		URL uri = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
		conn.setReadTimeout(10 * 1000);
		conn.setDoInput(true);
		conn.setDoOutput(true);
		conn.setUseCaches(false);
		conn.setRequestMethod("POST");
		conn.setRequestProperty("connection", "keep-alive");
		conn.setRequestProperty("Charsert", "UTF-8");
		conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
				+ ";boundary=" + BOUNDARY);
		conn.setRequestProperty("User-Agent",
				"android-async-http/1.4.1 (http://loopj.com/android-async-http)");
		conn.setRequestProperty("Cookie", "bduss=" + bduss);

		StringBuilder sb = new StringBuilder();
		for (Map.Entry<String, String> entry : params.entrySet()) {
			sb.append(PREFIX);
			sb.append(BOUNDARY);
			sb.append(LINEND);
			sb.append("Content-Disposition: form-data; name=\""
					+ entry.getKey() + "\"" + LINEND);
			sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
			sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
			sb.append(LINEND);
			sb.append(entry.getValue());
			sb.append(LINEND);
		}

		DataOutputStream outStream = new DataOutputStream(
				conn.getOutputStream());
		outStream.write(sb.toString().getBytes());
		if (files != null)
			for (Map.Entry<String, File> file : files.entrySet()) {
				StringBuilder sb1 = new StringBuilder();
				sb1.append(PREFIX);
				sb1.append(BOUNDARY);
				sb1.append(LINEND);
				sb1.append("Content-Disposition: form-data; name=\""
						+ file.getKey() + "\"; filename=\""
						+ file.getValue().getName() + "\"" + LINEND);
				sb1.append("Content-Type: application/octet-stream; charset="
						+ CHARSET + LINEND);
				sb1.append(LINEND);
				outStream.write(sb1.toString().getBytes());

				InputStream is = new FileInputStream(file.getValue());
				byte[] buffer = new byte[1024];
				int len = 0;
				while ((len = is.read(buffer)) != -1) {
					outStream.write(buffer, 0, len);
				}

				is.close();
				outStream.write(LINEND.getBytes());
			}

		byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
		outStream.write(end_data);
		outStream.flush();
		int res = conn.getResponseCode();
		InputStream in = conn.getInputStream();
		StringBuilder sb2 = new StringBuilder();
		if (res == 200) {
			int ch;
			while ((ch = in.read()) != -1) {
				sb2.append((char) ch);
			}
		}
		outStream.close();
		conn.disconnect();
		return sb2.toString();
	}
}
